package com.are.odisea;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class GestionUsuario {

	private db conexion = null;
	private Usuario user;
	private String usuario="none";
	
	public static final int ORDER_CODIGO = 1;
	public static final int ORDER_NOMBRE = 2;
	public static final int ORDER_PERFIL = 3;

	public GestionUsuario(db conexion) {
		super();
		this.conexion = conexion;
		this.user = new Usuario();
	}
	public GestionUsuario(db conexion, Usuario user, String usuario) {
		super();
		this.conexion = conexion;
		this.user = user;
		this.usuario = usuario;
	}
	public db getConexion() {
		return conexion;
	}
	public void setConexion(db conexion) {
		this.conexion = conexion;
	}
	public Usuario getUser() {
		return user;
	}
	public void setUser(Usuario user) {
		this.user = user;
	}

	public boolean add() throws SQLException{
		boolean result = false;

			String sql = "insert into usuarios (USER,NOMBRE,perfil,PWD,estado,descargas,inventario,noticias,documentos,encuestas,FEC_REG,usuario_creacion,bandejas,gbandejas,personal,rol) values (?,?,?,password(?),?,?,?,?,?,?,sysdate(),?,?,?,?,?)";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, user.getCodigo());
			pst.setString(2, user.getNombre());
			pst.setString(3, user.getPerfil());
			pst.setString(4, user.getClave());
			pst.setString(5, user.getEstado());
			pst.setString(6, user.getPermitirDescargar());
			pst.setString(7, user.getPermitirVerInventario());
			pst.setString(8, user.getPermitirVerNoticias());
			pst.setString(9, user.getPermitirVerDocumentos());
			pst.setString(10, user.getPermitirVerEncuentas());
			pst.setString(11, this.usuario);
			pst.setString(12, user.getPermitirVerBandejas());
			pst.setString(13, user.getPermitirGestionarBandejas());
			pst.setString(14, user.getPersonal());
			pst.setString(15, user.getRol());
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
			
		
		return result;
	}
	
	public boolean update(String key) throws SQLException{
		boolean result = false;

			String sql = "update usuarios set USER= ?, NOMBRE=?,perfil=?,estado=?,descargas=?,inventario=?,noticias=?,documentos=?,encuestas=?,bandejas=?,gbandejas=?,personal=?,rol=? where USER=?";
			
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, user.getCodigo());
			pst.setString(2, user.getNombre());
			pst.setString(3, user.getPerfil());
			pst.setString(4, user.getEstado());
			pst.setString(5, user.getPermitirDescargar());
			pst.setString(6, user.getPermitirVerInventario());
			pst.setString(7, user.getPermitirVerNoticias());
			pst.setString(8, user.getPermitirVerDocumentos());
			pst.setString(9, user.getPermitirVerEncuentas());
			pst.setString(10, user.getPermitirVerBandejas());
			pst.setString(11, user.getPermitirGestionarBandejas());
			pst.setString(12, user.getPersonal());
			pst.setString(13, user.getRol());
			pst.setString(14, key);
			
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
			
		return result;
	}
	public boolean remove(String key) throws SQLException {
		boolean result = false;

			String sql = "delete from usuarios where USER=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
			

		return result;	
	}
	
	
	public boolean exist(String key) throws SQLException {
		boolean result = false;

			String sql = "select USER from usuarios where USER = ?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				result = true;
			}
			rs.close();
			
		
		return result;	
	}
	
	public boolean Find(String key) throws SQLException {
		boolean result = false;

			String sql = "select * from usuarios where USER=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				user = new Usuario();
				user.setId(rs.getString("id"));
				user.setCodigo(rs.getString("USER"));
				user.setNombre(rs.getString("NOMBRE"));
				user.setClave(rs.getString("PWD"));
				user.setPerfil(rs.getString("perfil"));
				user.setEstado(rs.getString("estado"));
				user.setPermitirDescargar(rs.getString("descargas"));
				user.setPermitirVerDocumentos(rs.getString("documentos"));
				user.setPermitirVerEncuentas(rs.getString("encuestas"));
				user.setPermitirVerInventario(rs.getString("inventario"));
				user.setPermitirVerNoticias(rs.getString("noticias"));
				user.setFechaCreacion(rs.getString("FEC_REG"));
				user.setUsuarioCreacion(rs.getString("usuario_creacion"));
				user.setPermitirVerBandejas(rs.getString("bandejas"));
				user.setPermitirGestionarBandejas(rs.getString("gbandejas"));
				user.setPersonal(rs.getString("personal"));
				user.setRol(rs.getString("rol"));
				result = true;
			}
			rs.close();
			
		return result;	
	}
	
	public ArrayList<Usuario> list() throws SQLException {
		ArrayList<Usuario> users = new ArrayList<Usuario>();
		
			String sql = "select * from usuarios order by USER";
			ResultSet rs  = conexion.Query(sql);
			while(rs.next()) {
				Usuario u = new Usuario();
				u.setId(rs.getString("id"));
				u.setCodigo(rs.getString("USER"));
				u.setNombre(rs.getString("NOMBRE"));
				u.setPerfil(rs.getString("perfil"));
				u.setEstado(rs.getString("estado"));
				u.setPermitirDescargar(rs.getString("descargas"));
				u.setPermitirVerDocumentos(rs.getString("documentos"));
				u.setPermitirVerEncuentas(rs.getString("encuestas"));
				u.setPermitirVerInventario(rs.getString("inventario"));
				u.setPermitirVerNoticias(rs.getString("noticias"));
				u.setFechaCreacion(rs.getString("FEC_REG"));
				u.setUsuarioCreacion(rs.getString("usuario_creacion"));
				u.setPermitirVerBandejas(rs.getString("bandejas"));
				u.setPermitirGestionarBandejas(rs.getString("gbandejas"));
				u.setPersonal(rs.getString("personal"));
				u.setRol(rs.getString("rol"));
				users.add(u);
			}
			rs.close();
		
		return users;
	}
	
	public ArrayList<Usuario> list(int orden) throws SQLException {
		ArrayList<Usuario> users = new ArrayList<Usuario>();

			String sql = "select * from usuarios ";
			
			switch(orden) {
			case ORDER_CODIGO:
				sql += " order by USER";
			break;
			case ORDER_NOMBRE:
				sql += " order by NOMBRE";
			break;
			case ORDER_PERFIL:
				sql += " order by perfil";
			break;
			}
			ResultSet rs  = conexion.Query(sql);
			while(rs.next()) {
				Usuario u = new Usuario();
				u.setId(rs.getString("id"));
				u.setCodigo(rs.getString("USER"));
				u.setNombre(rs.getString("NOMBRE"));
				u.setPerfil(rs.getString("perfil"));
				u.setEstado(rs.getString("estado"));
				u.setPermitirDescargar(rs.getString("descargas"));
				u.setPermitirVerDocumentos(rs.getString("documentos"));
				u.setPermitirVerEncuentas(rs.getString("encuestas"));
				u.setPermitirVerInventario(rs.getString("inventario"));
				u.setPermitirVerNoticias(rs.getString("noticias"));
				u.setFechaCreacion(rs.getString("FEC_REG"));
				u.setUsuarioCreacion(rs.getString("usuario_creacion"));
				u.setPermitirVerBandejas(rs.getString("bandejas"));
				u.setPermitirGestionarBandejas(rs.getString("gbandejas"));
				u.setPersonal(rs.getString("personal"));
				u.setRol(rs.getString("rol"));
				users.add(u);
			}
			rs.close();
		
		return users;	
	}
	
	public ArrayList<Usuario> list(String criterio,int orden) throws SQLException {
		ArrayList<Usuario> users = new ArrayList<Usuario>();

			String sql = "select * from usuarios where user like ? or nombre like ?";
			
			switch(orden) {
			case ORDER_CODIGO:
				sql += " order by USER";
			break;
			case ORDER_NOMBRE:
				sql += " order by NOMBRE";
			break;
			case ORDER_PERFIL:
				sql += " order by perfil";
			break;
			}
			
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, "%" + criterio + "%");
			pst.setString(2, "%" + criterio + "%");
			ResultSet rs  = conexion.Query(pst);
			while(rs.next()) {
				Usuario u = new Usuario();
				u.setId(rs.getString("id"));
				u.setCodigo(rs.getString("USER"));
				u.setNombre(rs.getString("NOMBRE"));
				u.setPerfil(rs.getString("perfil"));
				u.setEstado(rs.getString("estado"));
				u.setPermitirDescargar(rs.getString("descargas"));
				u.setPermitirVerDocumentos(rs.getString("documentos"));
				u.setPermitirVerEncuentas(rs.getString("encuestas"));
				u.setPermitirVerInventario(rs.getString("inventario"));
				u.setPermitirVerNoticias(rs.getString("noticias"));
				u.setFechaCreacion(rs.getString("FEC_REG"));
				u.setUsuarioCreacion(rs.getString("usuario_creacion"));
				u.setPermitirVerBandejas(rs.getString("bandejas"));
				u.setPermitirGestionarBandejas(rs.getString("gbandejas"));
				u.setPersonal(rs.getString("personal"));
				u.setRol(rs.getString("rol"));
				users.add(u);
			}
			rs.close();
		
		return users;	
	}
	
	public boolean login(String usuario,String clave) throws SQLException {
		boolean ret = false;

			String sql = "select * from usuarios where USER=? and PWD=password(?) and estado=1";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,usuario);
			pst.setString(2,clave);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				user = new Usuario();
				user.setId(rs.getString("id"));
				user.setCodigo(rs.getString("USER"));
				user.setNombre(rs.getString("NOMBRE"));
				user.setPerfil(rs.getString("perfil"));
				user.setEstado(rs.getString("estado"));
				user.setPermitirDescargar(rs.getString("descargas"));
				user.setPermitirVerDocumentos(rs.getString("documentos"));
				user.setPermitirVerEncuentas(rs.getString("encuestas"));
				user.setPermitirVerInventario(rs.getString("inventario"));
				user.setPermitirVerNoticias(rs.getString("noticias"));
				user.setFechaCreacion(rs.getString("FEC_REG"));
				user.setUsuarioCreacion(rs.getString("usuario_creacion"));
				user.setPermitirVerBandejas(rs.getString("bandejas"));
				user.setPermitirGestionarBandejas(rs.getString("gbandejas"));
				user.setPersonal(rs.getString("personal"));
				user.setRol(rs.getString("rol"));

				ret = true;
			}
			

		
		return ret;
	}
	
	public ArrayList<Perfiles> perfiles() throws SQLException {
		ArrayList <Perfiles> p = new ArrayList<Perfiles>();
		String sql = "select * from perfiles order by perfil";
			ResultSet rs = conexion.Query(sql);
			while(rs.next()) {
				Perfiles a = new Perfiles();
				a.setId(rs.getString("id"));
				a.setPerfil(rs.getString("perfil"));
				p.add(a);
			}
		
		return p;
		
	
	}
	
	public ArrayList<Roles> getRoles() throws SQLException {
		ArrayList<Roles> roles = new ArrayList<Roles>();
		String sql = "select * from roles order by descripcion";
		ResultSet rs = conexion.Query(sql);
		while(rs.next()) {
			Roles rol = new Roles();
			rol.setId(rs.getString("id"));
			rol.setDescripcion(rs.getString("descripcion"));
			roles.add(rol);
		}
		return roles;
	}
	
	public boolean changepassword(String usuario,String clave) throws SQLException {
		boolean ret = false;

			String sql = "update usuarios set PWD=password(?) where USER=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,clave);
			pst.setString(2,usuario);
			if (conexion.Update(pst)>0) {
				conexion.Commit();
				ret = true;
			}
		
		
		return ret;
	}
	
	public boolean AddPersonal (com.are.entidades.UsuarioPersonal personal) throws SQLException {
		boolean ret = false;

		String sql = "insert into usuario_personal (usuario,cedula) values (?,?)";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1,personal.getUsuario());
		pst.setString(2,personal.getCedula());
		if (conexion.Update(pst)>0) {
			conexion.Commit();
			ret = true;
		}
		return ret;
	}

	public boolean RemovePersonal (String id) throws SQLException {
		boolean ret = false;

		String sql = "delete from usuario_personal where id = ?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1,id);
		if (conexion.Update(pst)>0) {
			conexion.Commit();
			ret = true;
		}
		return ret;
	}

	public boolean ExistUsuarioPersonal (String usuario,String cedula) throws SQLException {
		boolean ret = false;

		String sql = "select * from usuario_personal where usuario =? and cedula = ?";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1,usuario);
		pst.setString(2,cedula);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			ret = true;
		}
		return ret;
	}
	
	public int CountPersonal (String usuario) throws SQLException {
		int contador = 0;
		String sql = "select usuario,count(cedula) from usuario_personal where usuario =? group by usuario";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1,usuario);
		ResultSet rs = conexion.Query(pst);
		if (rs.next()) {
			contador = rs.getInt(2);
		}
		return contador;
	}
	
	
	public ArrayList<com.are.entidades.UsuarioPersonal> ListaUsuarioPersonal (String usuario) throws SQLException {
		ArrayList<com.are.entidades.UsuarioPersonal> lista = new ArrayList<com.are.entidades.UsuarioPersonal>();
		String sql = "select id,usuario,cedula,persnomb,persapel from usuario_personal,personal where usuario =? and cedula=perscodi order by persnomb,persapel";
		java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
		pst.setString(1,usuario);
		ResultSet rs = conexion.Query(pst);
		while(rs.next()) {
			com.are.entidades.UsuarioPersonal up = new com.are.entidades.UsuarioPersonal();
			up.setCedula(rs.getString("cedula"));
			up.setNombre(rs.getString("persnomb") + " " + rs.getString("persapel"));
			up.setUsuario(rs.getString("usuario"));
			up.setId(rs.getString("id"));
			lista.add(up);
		}
		
		
		return lista;
	}

	
	public String getUsuario() {
		return usuario;
	}
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
}